package hmvc4gwt.framework.client.controller;

import hmvc4gwt.client.controller.AController;
import hmvc4gwt.client.event.IEvent;
import hmvc4gwt.framework.client.events.CloseViewEvent;
import hmvc4gwt.framework.client.events.RemoveViewEvent;
import hmvc4gwt.framework.client.events.TerminateEvent;

public abstract class GuiController extends AController {

	/**
	 * registriert den Controller für das Emfangen von Framework-Events
	 */
	public void init() {
		register(TerminateEvent.class, this);
		register(CloseViewEvent.class, this);
		
		initImpl();
	}

	/**
	 * repräsentiert die Initializeable-Methode doInit()
	 */
	protected abstract void initImpl();

	public void handleEvent(IEvent event) {
		
		if (event instanceof TerminateEvent) {			
			
			/*
			 * View aus dem RootPanel entfernen
			 */
			fireEventUp(new RemoveViewEvent(getView()));
			
			/*
			 * Triade entfernen
			 */
			getComponent().terminate();
//			fireEvent(new RemoveTerminatedChildsEvent(), true, false, false);
			
			return;
			
		} else if (event instanceof CloseViewEvent) {
			
			if (getView() != null) {
				/*
				 * View aus dem RootPanel entfernen, nur wenn sie Angezeigt wird
				 */
				
				if (getView().isVisible()) {
					fireEventUp(new RemoveViewEvent(getView()));
				}
			}
			
			return;
		}

		/*
		 * Event weiter leiten
		 */
		handleEventImpl(event);
	}

	/**
	 * Repräsentiert die Interfacte-Methode HmvcEventListener.handleEvent(). Sie
	 * wird vom Framework nach dem Auruf von handleEvent() aufgerufen
	 * 
	 * @param event
	 */
	public abstract void handleEventImpl(IEvent event);
	
	public void terminate() {
		// TODO Auto-generated method stub

	}
	
}
